package com.mh.web.controller.Common;

import com.mh.common.constant.Constants;
import com.mh.common.utils.ChainedMap;
import com.mh.common.utils.UUIDUtils;
import com.wf.captcha.SpecCaptcha;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.Duration;

@RestController
public class CaptchaController {

    //保存时用RedisTemplate, 缓存时用自定义的RedisCache-->为了功能区分
    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/captchaImage")
    public ChainedMap getCaptchaCode(HttpServletResponse resp) {
        //1. 生成验证码
        SpecCaptcha captcha = new SpecCaptcha(130, 48, 4);

        //2. 通过UUIDUtils工具类生成唯一标识,作为key
        String uuid = UUIDUtils.simpleUUID();

        //3. 定义存储Redis的Key & value(验证码)
        //通过自定义的常量类设置key的前缀+唯一标识uuid
        String key = Constants.CAPTCHA_CODE_KEY + uuid;
        //captcha.text(): 1生成的验证码中获取文字
        //toLowerCase(): 全部小写(为了实现验证码不区分大小写)
        String value = captcha.text().toLowerCase();

        System.out.println("生成验证码:"+captcha.text());

        //4. 验证码信息存储到Redis中,并设置数据过期时间(10分钟后过期)
        redisTemplate.opsForValue().set(key,value, Duration.ofMinutes(10));

        //System.out.println("Redis中取出的验证码为:"+redisTemplate.opsForValue().get(key));

        //5. 根据接口文档定义规则,集合的key值必须是"uuid"和"img"-->封装到Map集合响应前端
        //ChainedMap自定义的链式Map实现,主要用于存储键值对,并提供了链式调用的能力
        //captcha.toBase64(): 验证码图像转为字符串, 将二进制数据转换为文本格式的方式
        return ChainedMap.create().set("uuid", uuid).set("img", captcha.toBase64());
    }
}
